package com.zz.examine.case1;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 *
 */
public class ShootOddPerson {
    public static List<People> peoples = new ArrayList <>();
    public static void main(String args[]){
        //目标：完成幸存者案例
        /**
         * 1.由于每个囚犯是一个对象，
         * 并且我们需要每个囚犯的编号和 位置，
         * 所以我们需要将囚犯封装成对象.
         * 2.创建100个囚犯，依次站位，并为其赋值编号（1-200）的随机数，不能重复
         */
        //3.循环100次，创建100个囚犯，存入集合
        Random r = new Random();
        for(int i = 1;i <= 100; i++){
            while(true){
                int code = r.nextInt(200) + 1;
                //判断编号是否唯一
                if(exist(code)) {
                    People p = new People(code, i);
                    peoples.add(p);
                    break;//代表当前囚犯添加成功
                }
            }
        }
        System.out.println("囚犯站位" + peoples);

        //4.反复删除奇数位置处的人，知道剩余一个人为止
        //peoples = [p1,p2,p3,.....]
        while(peoples.size() > 1){
            //干掉奇数位置的人：逆向思维--留下偶数位置处的人
            List<People> tempPeoples = new ArrayList <>();
            for(int i = 1; i < peoples.size(); i+=2){
                People p = peoples.get(i);
                tempPeoples.add(p);
            }
            peoples = tempPeoples;
        }
        People luckPeople = peoples.get(0);
        System.out.println(luckPeople);
    }
    //判断编号是否存在
    public static boolean exist(int code){
        for(People people:peoples){
            if(people.getCode() == code)
                return false;//重复了，不能用
        }
        return true;
    }
}
